#ifndef SERVERSOCKET_H
#define SERVERSOCKET_H
#include "Configuracion.h"
#include "Socket.h"
#include <string>

class Listener;
class ServerSocket: public Socket, public Thread {
  public:
    ServerSocket();
    explicit ServerSocket(Listener *listener);
    explicit ServerSocket(t_puerto puerto) {
        setPuerto(puerto);
    }
    virtual ~ServerSocket();
    /** Descripcion: conecta el socket.
    *   POS: el socket queda en estado "listen" en caso de exito.
    *   Retorno: 1 -> error, 0 -> exito
    */
    int conectar();
    /** Getters y Setters */
    int getSocketPuerto() {
        return this->socket_puerto;
    }
    void setSocketPuerto(int socket = -1) {
        this->socket_puerto = socket;
    }
    void setListener(Listener *listener = NULL) {
        this->listener = listener;
    }

    /** Descripcion: acepta conexiones entrantes hasta un maximo de
    *   MAX_COLA_ESPERA_SOCKET hasta que el puerto sea apagado.
    *   PRE: puerto conectado.
    *   Retorno: -1 -> error, 0 -> exito
    */
    void *run();

    void imprimir();
    int aceptar();
    /** Descripcion: cierra ultima conexion entrante aceptada.
    *   Retorno: -
    */
    void cancelar();

    void apagar();
    std::string aString();

    bool aceptando();
    bool inicializado();

    void setEstado(int estado) {
        this->estado = estado;
    }

    /** Descripcion: devuelve un puntero a objeto Socket para comunicarse
    con el ultimo socket aceptado */
    Socket *getSocketAceptado();

  private:
    Listener *listener;
    int socket_puerto;
    int estado;
};

#endif // SERVERSOCKET_H
